#include <bits/stdc++.h>
using namespace std;
#define int long long

int n, m, c[505];
const int p = 998244353;
char s[505];


namespace CR200J {
	int dp[1<<18][19], ppc[1<<18];
	int dfs(int f, int i) {
		if (f == (1 << n) - 1) {
			return (n-i >= m);
		}
		if (dp[f][i] != -1) return dp[f][i];
		int ans = 0, it = ppc[f] + 1;
		for (int d = 1; d <= n; ++d) {
			if (f & (1 << (d - 1))) continue;
			ans += dfs(f | (1 << (d - 1)), i + (s[it] == '0' || i >= c[d]));
		}
		return dp[f][i] = ans % p;
	}
	void main() {
		ppc[0] = 0;
		for (int f = 1; f < (1 << n); ++f) {
			ppc[f] = ppc[f - (f & (-f))] + 1;
		}
		memset(dp, 255, sizeof(dp));
		cout << dfs(0, 0) << "\n";
	}
}

signed main() {
	freopen("employ.in", "r", stdin); freopen("employ.out", "w", stdout);
	ios::sync_with_stdio(0); cin.tie(0);
	cin >> n >> m;
	cin >> (s + 1);
	for (int i = 1; i <= n; ++i) cin >> c[i];
	if (n <= 18) CR200J::main();
	else if (m == n) {
		bool flg = 1;
		for (int i = 1; i <= n; ++i) flg &= (c[i] && s[i] == '1');
		if (flg == 0) {
			cout << "0\n";
		} else {
			int res = 1;
			for (int i = 1; i <= n; ++i) res = res * i % p;
			cout << res << "\n";
		}
	} else cout << "0\n";
	return 0;
}
/*

开局被硬控

[22:33] T1 暂时还没想出一定对的做法，但是一个基本思路是枚举哪一个社团有 n/2 个人，剩下的大力贪。

14:33



但是：

5 0 0
0 5 0
0 0 5

T2

[22:40] 这个 1e4 的数据范围很奇妙

然后这个 k <= 10 大概率是状态压缩状物

让他们联通这个事情真的好作吗？

这场怎么办

T1 

考虑 B 性质，那就是一个这个问题，两个组分成两半，求值最大。

0 100
100 99
98 0
97 0

为了获得最大值，我们考虑排序，然后贪心选？

很可惜这是错的

100 99
98 100
97 0
0  0

flow?

这个 n/2 一定是有说法的

我们看社团人数最多的是哪一个团。

不我们应该仔细想 B 性质应该怎么做

105 100
108 109

说法会不会是 a_i,j <= 2e4？还只是为了防爆 int 用的？现在什么年代？

大胆猜结论

错的很离谱

反悔贪心可以吗？

我们逐个加入，选择最大的加入。

然后如果一个东西加满了，我们就看这里面最小的替换

啊

但是三个元素怎么做啊

n/2 一定是有说法的啊

那我们考虑，在三个元素的情况下，我们可以枚举“最不赚”的集合是什么，然后来做这个反悔贪心，如果到最后这个“最不赚”的集合反而大于 n/2，那么就是不可以的

应该是可以的吧

终于开拍了，我也不知道我写了什么

但是千万别挂

[23:41]

我们选择那些城市化节点

然后最小生成树？

时间复杂度 2^k (m+nk) log m

确实很吃力，不过 log 可以被去掉换成归并

（不会真的是大力归并吧？

写写看，至少这样做的话分数很客观

马上，城市和乡镇是不是有本质区别？

好的，1.5h 过掉 T1T2

上厕所。

[00:09] 左边的dailao 似乎做 T3 很长时间没有写代码了

T3 首先思考我会什么

如果我们大力字符串哈希

那么是多少分

分数不高

如果我们把两个字符串不一样的部分单独提出来

哈希值相减？

但是这是有点错的

zabcz zadez
xabcx xadex

看看别的题

[00:47]

首先 T4 我只会暴力

A 性质不是 n! 吗？

不对有 c=0

那就排序之后？然后？

考虑常规情况下怎么排列计数

插入法

很困难的题

m=1 怎么做

就考虑没有一个人被录用

状态肯定是有天数

1.5h 了，我该怎么办

不管怎样我必须在这两道题拼出 100pts

T3 这道题我可以考虑什么

字典树吗？

首先考虑部分分

1~8 和 13~14 是显然的

然后呢

我有一种强烈的在这道题目写假算的欲望，就是哈希值相减的这个假算

先写再说

精神过 T3 了

多少分我不知道

（此时我意识到 UTC+0 的时间会影响我的判断，于是我把时间切换为了 UTC+8）

[17:47] 我该怎么办？？？怎亚怎么办？？？？

现在唯一的法子就是快速地把 T4 暴力+特殊性质写完（24pts）

然后立刻检查！

精神 300+ 好吧

[18:04] 现在实际剩余时间只有 20min，我还能做些什么

看看 T4 吧，T3 我觉得如果出题人要卡也没有办法

现在也不能对 T2 T3 下手了，不会就是不会，菜就是菜。没有别的可能。

只能希望这一届出题人善良一点吧。

[18:09] 已经没有拿更多分的必要了。

我能做的就是 T2 卡卡常，T3 再优化优化，其他就没有了。

我还能怎么办呢？这 4h 一晃就过去了，我得到了什么？

[20,100] + [80,100] + [60,100] + 24 = [184, 324]

我学了一年真的有什么实质性的进步吗？？

看样子应该是 WC 无缘了

还能有明年吗？

[18:22] 换了一下 mod，此时结局应该已经定了。

切系统。

我就是之前用两种编码写游记的人，现在我只使用了一种编码。

726525, ChatSheep, 2022/5/10 ~ 2025/11/1。



*/

